require('module-alias/register'); // 引入别名
require('dotenv').config(); // 加载 .env 文件中的环境变量到 process.env
const express = require('express');
const path = require('path');
const serveFavicon = require('serve-favicon');
const cors = require('cors');
const logger = require('morgan');

const { resSendMiddleware, errorHandler } = require('./middleware/index.js'); // 自定义中间件
const token_manager = require('./utils/jwt.js');
const router = require('./router');
const { port } = require('./config');
const swaggerInit = require('./swagger.js');

// 创建服务器
const app = express();
swaggerInit(app);

/* 第三方中间件 */
app.use(logger('dev')); // 日志
app.use(cors()); // 注入cors模块解决跨域
app.use(serveFavicon(path.resolve('public/favicon.ico'))); // favicon

/* 内置中间件 */
// 处理post请求体的数据到 req.body
app.use(express.urlencoded({ extended: false })); // 解析form表单提交的数据application/x-www-form-urlencoded
app.use(express.json()); // 解析json数据格式

app.use(express.static(path.join(__dirname, 'public'))); // 静态资源
// app.use(express.static(path.resolve("public")));

/* 应用级中间件 */
app.use(resSendMiddleware);

app.use(token_manager.guard()); // 拦截校验//token守卫，每一个路由都验证token合法性，白名单地址无需校验。
app.use((req, res, next) => {
  if (!req.auth && req.headers?.authorization)
    req.auth = token_manager.verify(req.headers.authorization);
  next();
}); // 解决 expressjwt的放行的白名单路由 req.auth 参数没值

app.get('/', (req, res) => {
  res.send('Hello Peak!');
});

/* 路由级中间件 */
app.use('/api', router);

/* 错误处理中间件 */
// 401 错误拦截
app.use(function (err, req, res, next) {
  if (err.name == 'UnauthorizedError') {
    res.status(401).json({
      code: 401,
      msg: '当前未登录',
      data: null,
    });
  } else {
    next(err);
  }
});

// 统一异常处理中间件
app.use(errorHandler);

app.listen(port, () => {
  console.log(`服务器在端口${port}上运行: http://localhost:${port}`);
});
